home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / start.s < prev    next >
Text File  |  1995-07-08  |  9KB  |  301 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *  Portions Copyright (C) 1994 Rafael W. Luebbert
  5.  *
  6.  *  This library is free software; you can redistribute it and/or
  7.  *  modify it under the terms of the GNU Library General Public
  8.  *  License as published by the Free Software Foundation; either
  9.  *  version 2 of the License, or (at your option) any later version.
  10.  *
  11.  *  This library is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  *  Library General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU Library General Public
  17.  *  License along with this library; if not, write to the Free
  18.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21. #define START
  22. #include "ixemul.h"
  23.  
  24.  
  25.     .text
  26.  
  27.    | The first executable location.  This should return an error
  28.    | in case someone tried to run you as a program (instead of
  29.    | loading you as a library).
  30.     .globl    Start        | we use this to force inclusion of start.s
  31. Start:
  32.    movel   #-1,d0
  33.    rts
  34.  
  35. |-----------------------------------------------------------------------
  36. | A romtag structure.  Both "exec" and "ramlib" look for
  37. | this structure to discover magic constants about you
  38. | (such as where to start running you from...).
  39. |-----------------------------------------------------------------------
  40.  
  41. initDDescrip:
  42.                |STRUCTURE RT,0
  43.      .word    RTC_MATCHWORD      | UWORD RT_MATCHWORD
  44.      .long    initDDescrip       | APTR  RT_MATCHTAG
  45.      .long    EndCode            | APTR  RT_ENDSKIP
  46.      .byte    RTF_AUTOINIT       | UBYTE RT_FLAGS
  47.      .byte    IX_VERSION         | UBYTE RT_VERSION
  48.      .byte    NT_LIBRARY         | UBYTE RT_TYPE
  49.      .byte    IX_PRIORITY        | BYTE  RT_PRI
  50.      .long    ixName             | APTR  RT_NAME
  51.      .long    idString           | APTR  RT_IDSTRING
  52.      .long    Init               | APTR  RT_INIT
  53. | this is just fool proof, and this library will never make it to ROM
  54. | anyway, so resident tags are not that important ;-)
  55. EndCode:
  56.  
  57.  
  58.    | this is the name that the library will have
  59. ixName:    .asciz IX_NAME
  60.  
  61.    | this is an identifier tag to help in supporting the library
  62.    | format is 'name version.revision (dd.mm.yy)',<cr>,<lf>,<null>'
  63.    | without any leading zeros in dd.mm.yy
  64. idString:
  65.     .ascii IX_IDSTRING
  66.     .byte 13 
  67.     .byte 10 
  68.     .byte 0 
  69.  
  70.    | force word alignment
  71.    .even
  72.  
  73.  
  74.    | The romtag specified that we were "RTF_AUTOINIT".  This means
  75.    | that the RT_INIT structure member points to one of these
  76.    | tables below.  If the AUTOINIT bit was not set then RT_INIT
  77.    | would point to a routine to run.
  78.  
  79. Init:
  80.    .long   IXBASE_SIZEOF    | size of library base data space
  81.    .long   funcTable        | pointer to function initializers
  82.    .long   dataTable            | pointer to data initializers
  83.    .long   initRoutine            | routine to run
  84.  
  85.  
  86. funcTable:
  87.  
  88.    |------ standard system routines
  89.    .long   Open
  90.    .long   Close
  91.    .long   Expunge
  92.    .long   Null
  93.  
  94.    |------ my libraries definitions
  95. #ifdef TRACE_LIBRARY
  96. #define SYSTEM_CALL(func, vec) .long trace_/**/func
  97. #else
  98. #define SYSTEM_CALL(func, vec) .long _/**/func
  99. #endif
  100. #include <sys/syscall.def>
  101. #undef SYSTEM_CALL
  102.  
  103.    |------ function table end marker
  104.    .long   -1
  105.  
  106. #ifdef TRACE_LIBRARY
  107. #define SYSTEM_CALL(func, vec) \
  108. trace_/**/func: ;                        \
  109.     pea _/**/func;                        \
  110.     pea vec;                         \
  111.     jsr _trace_entry;                    \
  112.     lea sp@(8),sp;                        \
  113.     tstl d0;                        \
  114.     beq  1f;        /* jump directly there */    \
  115.     /* in that case, trace_entry already provided the result */    \
  116.     movel sp@(-4),d0;                    \
  117.     rts;                            \
  118. 1:    jmp _/**/func;
  119. #include <sys/syscall.def>
  120. #undef SYSTEM_CALL
  121. #endif
  122.  
  123.  
  124.  
  125.    | The data table initializes static data structures.
  126.    | The format is specified in exec/InitStruct routines
  127.    | manual pages.  The INITBYTE/INITWORD/INITLONG routines
  128.    | are in the file "exec/initializers.i".  The first argument
  129.    | is the offset from the library base for this byte/word/long.
  130.    | The second argument is the value to put in that cell.
  131.    | The table is null terminated
  132.    | NOTE - LN_TYPE below is a correction - old example had LH_TYPE
  133.  
  134. dataTable:
  135.     INITBYTE (LN_TYPE,         NT_LIBRARY)
  136.     INITLONG (LN_NAME,         ixName)
  137.     INITBYTE (IXBASE_FLAGS,     0x6) |LIBF_CHANGED_SUMUSED
  138.     INITWORD (IXBASE_VERSION,     IX_VERSION)
  139.     INITWORD (IXBASE_REVISION,     IX_REVISION)
  140.     INITLONG (IXBASE_IDSTRING,     idString)
  141.     .long   0
  142.  
  143.  
  144. #ifdef DEBUG
  145. twoint:
  146.     .asciz "$%lx, $%lx\n"
  147. #endif
  148.  
  149.    | This routine gets called after the library has been allocated.
  150.    | The library pointer is in D0.  The segment list is in A0.
  151.    | If it returns non-zero then the library will be linked into
  152.    | the library list.
  153. initRoutine:
  154.  
  155.    |------ get the library pointer into a convenient A register
  156.    movel   a5,sp@-
  157.    movel   d0,a5
  158.    |------ save a pointer to exec
  159.    movel   a6,a5@(IXBASE_SYSLIB)
  160.  
  161.    |------ save a pointer to our loaded code
  162.    movel   a0,a5@(IXBASE_SEGLIST)
  163.  
  164.    |------ do the higher-level initialization in C
  165.    pea       a5@
  166.    jbsr       _ix_init
  167.    lea       sp@(4),sp
  168.    movel   sp@+,a5
  169.    rts
  170.  
  171. |----------------------------------------------------------------------
  172. |
  173. | here begins the system interface commands.  When the user calls
  174. | OpenLibrary/CloseLibrary/RemoveLibrary, this eventually gets translated
  175. | into a call to the following routines (Open/Close/Expunge).  Exec
  176. | has already put our library pointer in A6 for us.  Exec has turned
  177. | off task switching while in these routines (via Forbid/Permit), so
  178. | we should not take too long in them.
  179. |
  180. |----------------------------------------------------------------------
  181.  
  182.  
  183.    | Open returns the library pointer in d0 if the open
  184.    | was successful.  If the open failed then null is returned.
  185.    | It might fail if we allocated memory on each open, or
  186.    | if only open application could have the library open
  187.    | at a time...
  188.  
  189. Open:      | ( libptr:a6, version:d0 )
  190.  
  191.  
  192.    |------ mark us as having another opener
  193.    addw   #1,a6@(IXBASE_OPENCNT)
  194.  
  195.    |------ prevent delayed expunges
  196.    | !!!!!!
  197.    | commo - example code uses private flags field (IXBASE_MYFLAGS), WHY????
  198.    | !!!!!!
  199.    bclr   #LIBB_DELEXP,a6@(IXBASE_FLAGS)
  200.  
  201.    |------ do other things in C
  202.    pea       a6@
  203.    jbsr       _ix_open
  204.    lea       sp@(4),sp
  205.    |--- ix_open() should return the library base, if all ok
  206.    
  207.    rts
  208.  
  209.    | There are two different things that might be returned from
  210.    | the Close routine.  If the library is no longer open and
  211.    | there is a delayed expunge then Close should return the
  212.    | segment list (as given to Init).  Otherwise close should
  213.    | return NULL.
  214.  
  215. Close:      | ( libptr:a6 )
  216.  
  217.    |------ do any cleanups needed in C
  218.    pea      a6@
  219.    jsr      _ix_close
  220.    lea      sp@(4),sp
  221.     
  222.    |------ set the return value
  223.    clrl   d0
  224.  
  225.    |------ mark us as having one fewer openers
  226.    subw   #1,a6@(IXBASE_OPENCNT)
  227.  
  228.    |------ see if there is anyone left with us open
  229.    bne    L11
  230.  
  231.    |------ see if we have a delayed expunge pending
  232.    btst   #LIBB_DELEXP,a6@(IXBASE_FLAGS)    | SEE ABOVE!
  233.    beq    L11
  234.  
  235.    |------ do the expunge
  236.    bsr    Expunge
  237. L11:
  238.    rts
  239.  
  240.  
  241.    | There are two different things that might be returned from
  242.    | the Expunge routine.  If the library is no longer open
  243.    | then Expunge should return the segment list (as given to
  244.    | Init).  Otherwise Expunge should set the delayed expunge
  245.    | flag and return NULL.
  246.    |
  247.    | One other important note: because Expunge is called from
  248.    | the memory allocator, it may NEVER Wait() or otherwise
  249.    | take long time to complete.
  250.  
  251. Expunge:   | ( libptr: a6 )
  252.  
  253.    moveml  d2/a5/a6,sp@-
  254.    movel   a6,a5
  255.    movel   a5@(IXBASE_SYSLIB),a6
  256.    
  257.    |------ see if anyone has us open
  258.    tstw    a5@(IXBASE_OPENCNT)
  259.    beq     L21
  260.  
  261.    |------ it is still open.  set the delayed expunge flag
  262.    bset    #LIBB_DELEXP,a5@(IXBASE_FLAGS)    | SEE ABOVE !!
  263.    clrl       d0
  264.    bra     Expunge_End
  265.  
  266. L21:
  267.    |------ go ahead and get rid of us.  Store our seglist in d2
  268.    movel   a5@(IXBASE_SEGLIST),d2
  269.  
  270.    |------ unlink from library list
  271.    movel   a5,a1
  272.    jsr       a6@(_LVORemove)
  273.    
  274.    |
  275.    | device specific closings here...
  276.    |
  277.    pea       a5@
  278.    jsr       _ix_expunge
  279.    lea       sp@(4),sp
  280.  
  281.    |------ free our memory
  282.    clrl    d0
  283.    movel   a5,a1
  284.    movew   a5@(IXBASE_NEGSIZE),d0
  285.  
  286.    subl    d0,a1
  287.    addw    a5@(IXBASE_POSSIZE),d0
  288.  
  289.    jsr       a6@(_LVOFreeMem)
  290.  
  291.    |------ set up our return value
  292.    movel   d2,d0
  293.  
  294. Expunge_End:
  295.    moveml  sp@+,d2/a5/a6
  296.    rts
  297.  
  298. Null:
  299.    clrl    d0
  300.    rts
  301.